﻿using BLevy.Datos.Repositories;
using BLevy.Entidad;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Transactions;

namespace BLevy.Negocio
{
    public class Socios
    {

        public static IList<Socio> FindAll()
        {
            try
            {
                ISocioRepository _repository = new SocioRepository();
                return _repository.FindAll();
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public static IList<Socio> FindByCodigoOrApellidoOrDocumento(string apellido, string documento, int? nrosocio)
        {
            if (String.IsNullOrEmpty(apellido))
                apellido = null;
            if (String.IsNullOrEmpty(documento))
                documento = null;
            if (nrosocio == 0)
                nrosocio = null;
            try
            {
                ISocioRepository _repository = new SocioRepository();
                return _repository.FindByCodigoOrApellidoOrDocumento(apellido, documento, nrosocio);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public static IList<Socio> FindAllConLocalidadZonaPlan()
        {
            try
            {
                ISocioRepository _repository = new SocioRepository();
                return _repository.FindAllConLocalidadZonaPlan();
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public static Socio FindByIdConLocalidadZonaPlanFormaPago(int id)
        {
            try
            {
                ISocioRepository _repository = new SocioRepository();
                return _repository.FindByIdConLocalidadZonaPlanFormaPago(id);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public static int Remove(int id)
        {
            try
            {
                ISocioRepository _repository = new SocioRepository();
                return _repository.Remove(id);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public static int Modify(Socio entity)
        {
            int socio_result = 0;
            int adherente_result = 0;
            bool resultado = true;
            ISocioRepository _repositorySocio = new SocioRepository();
            IAdherenteRepository _repositoryAdherente = new AdherenteRepository();
            //return _repository.Modify(entity);

            try
            {
                using (TransactionScope scope = new TransactionScope())
                {
                    socio_result = _repositorySocio.Modify(entity);
                    if (socio_result > 0)
                    {

                        if (entity.formapago.debito_automatico == 1)
                        {
                            //si tiene id existe el la db
                            if (entity.cuenta_bancaria.id != 0)
                            {
                                int cuenta = CuentasBancarias.Modify(entity.cuenta_bancaria);
                                if (cuenta == 0)
                                {
                                    resultado = false;
                                    socio_result = 0;
                                }
                            }
                            else // si no tiene id no existe en la db
                            {
                                entity.cuenta_bancaria.socio_id = entity.id;
                                int cuenta = CuentasBancarias.Add(entity.cuenta_bancaria);
                                if (cuenta == 0)
                                {
                                    resultado = false;
                                    socio_result = 0;
                                }
                            }
                        }

                        foreach (Adherente adherente in entity.adherentes)
                        {
                            adherente.socio_id = entity.id;

                            if (adherente.id != 0)
                            {
                                adherente_result = _repositoryAdherente.Modify(adherente);
                                if (adherente_result == 0)
                                {
                                    resultado = false;
                                    socio_result = 0;
                                    break;
                                }
                            }
                            else
                            {
                                adherente_result = _repositoryAdherente.Add(adherente);
                                if (adherente_result == 0)
                                {
                                    resultado = false;
                                    socio_result = 0;
                                    break;
                                }
                            }
                        }
                        if (resultado == true)
                        {
                            scope.Complete();
                        }
                    }

                }
            }
            catch (Exception e)
            {
                throw e;
            }
            return socio_result;
        }

        public static Socio FindById(int id)
        {
            try
            {
                ISocioRepository _repository = new SocioRepository();
                return _repository.FindById(id);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public static Socio FindByCertificado(int certificado)
        {
            try
            {
                ISocioRepository _repository = new SocioRepository();
                return _repository.FindByCertificado(certificado);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public static int SocioBaja(int id, SocioBaja baja)
        {
            try
            {
                ISocioRepository _repository = new SocioRepository();
                return _repository.SocioBaja(id, baja);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public static int SocioReactivar(int id, SocioBaja reactivar)
        {
            try
            {
                ISocioRepository _repository = new SocioRepository();
                return _repository.SocioReactivar(id, reactivar);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public static IList<Socio> FindAllActivos()
        {
            try
            {
                ISocioRepository _repository = new SocioRepository();
                return _repository.FindAllActivos();
            }
            catch (Exception e)
            {
                throw e;
            }
        }


        public static long FindNextNumeroCertificado()
        {
            try
            {
                ISocioRepository _repository = new SocioRepository();
                return _repository.FindNextNumeroCertificado();
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public static int VerificarNumeroCertificado(long numero_certificado)
        {
            try
            {
                ISocioRepository _repository = new SocioRepository();
                return _repository.VerificarNumeroCertificado(numero_certificado);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public static int Add(Socio newEntity)
        {
            int socio_id;
            bool resultado = true;

            ISocioRepository _repositorySocio = new SocioRepository();
            IAdherenteRepository _repositoryAdherente = new AdherenteRepository();

            try
            {
                using (TransactionScope scope = new TransactionScope())
                {
                    //registro el socio
                    socio_id = _repositorySocio.Add(newEntity);

                    //si es debito, inserto la cuenta
                    if (newEntity.formapago.debito_automatico == 1)
                    {
                        //inserto la cuenta bancaria
                        newEntity.cuenta_bancaria.socio_id = socio_id;
                        int cuenta = CuentasBancarias.Add(newEntity.cuenta_bancaria);
                        if (cuenta == 0)
                        {
                            resultado = false;
                            socio_id = 0;
                        }
                    }
                    //inserto los adherentes
                    foreach (Adherente adherente in newEntity.adherentes)
                    {
                        adherente.socio_id = socio_id;

                        int resultado_adherente = _repositoryAdherente.Add(adherente);

                        if (resultado_adherente == 0)
                        {
                            resultado = false;
                            socio_id = 0;
                            break;
                        }
                    }
                    //si fallo en algun lado es false
                    if (resultado == true)
                    {
                        scope.Complete();
                    }
                }
            }
            catch (Exception e)
            {
                throw e;
            }

            return socio_id;
        }

        public static int RegistrarMensaje(string mensaje)
        {
            bool resultado = true;
            int res = 0;
            ISocioRepository _repository = new SocioRepository();

            try
            {
                using (TransactionScope scope = new TransactionScope())
                {
                    IList<Socio> sociosL = _repository.FindAll();
                    foreach (Socio socio in sociosL)
                    {
                        res = _repository.RegistrarMensaje(socio.id, mensaje);
                        if (res == 0)
                        {
                            resultado = false;
                            break;
                        }
                    }
                    if (resultado == true)
                    {
                        scope.Complete();
                    }
                }
            }
            catch (Exception e)
            {
                throw e;
            }

            return res;
        }


        public static IList<Socio> FindAllConLocalidadZonaPlanFiltro(string nroSocio, string documento, string apellido, string nombres, int? localidad_id, int? zona_id, int? formapago_id)
        {
            try
            {
                ISocioRepository _repository = new SocioRepository();
                return _repository.FindAllConLocalidadZonaPlanFiltro(nroSocio, documento, apellido, nombres, localidad_id, zona_id, formapago_id);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public static IList<Socio> FindAllFiltro(int? localidad_id, int? activo)
        {
            try
            {
                ISocioRepository _repository = new SocioRepository();
                return _repository.FindAllFiltro(localidad_id, activo);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public static IList<Socio> FindAllConAdherentesZona(int? activo)
        {
            try
            {
                ISocioRepository _repository = new SocioRepository();
                return _repository.FindAllConAdherentesZona(activo);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public static IList<Socio> FindAllConAdherentesPorMesCumpleaños(int mes)
        {
            try
            {
                ISocioRepository _repository = new SocioRepository();
                return _repository.FindAllConAdherentesPorMesCumpleaños(mes);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public static IList<Socio> FindBajasAutomaticas(DateTime fecha_baja)
        {
            try
            {
                ISocioRepository _repository = new SocioRepository();
                return _repository.FindBajasAutomaticas(fecha_baja);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public static IList<Socio> FindAllConLocalidadPlanByNroCertificadoByZona(string nro_cert_desde, string nro_cert_hasta, int? localidad_id, int? zona_id)
        {
            try
            {
                ISocioRepository _repository = new SocioRepository();
                return _repository.FindAllConLocalidadPlanByNroCertificadoByZona(nro_cert_desde, nro_cert_hasta, localidad_id, zona_id);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public static IList<SocioBaja> FindAllBajasFiltro(int? localidad_id, int? zona_id, DateTime? desde, DateTime? hasta)
        {
            try
            {
                ISocioRepository _repository = new SocioRepository();
                return _repository.FindAllBajasFiltro(localidad_id, zona_id, desde, hasta);
            }
            catch (Exception e)
            {
                throw e;
            }
        }


        public static IList<SocioStruct> FindAllFiltro(string nroSocio, string documento, string apellido, string nombres, int? localidad_id, int? zona_id, int? formapago_id, int? dosperiodos, int? tresperiodos)
        {
            try
            {
                ISocioRepository _repository = new SocioRepository();
                return _repository.FindAllFiltro(nroSocio, documento, apellido, nombres, localidad_id, zona_id, formapago_id, dosperiodos, tresperiodos);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

    }
}
